//go:build ignore

package main

import (
	"fmt"
	"time"
)

/**
 * go 常见基础面试题: https://zhuanlan.zhihu.com/p/471490292
 */

// 这个函数可以传入任意数量的整型参数
func sum(nums ...int) {
	total := 0
	for _, num := range nums {
		total += num
	}
	fmt.Printf("使用slice实现函数可变参数...\n")
	fmt.Println(total)

	fmt.Printf("2024.6.4 test \n")
	// for 语句,初始化和后置语句不是必须的,可省略
	// 注意!!!,此种写法,递归变量初始值不能为0,否则递增无效,陷入死循环
	count := 1
	for count < 100 {
		count += count
		fmt.Println(count)
	}
	fmt.Printf("for 精简模式, count:\n")
	fmt.Println(count)
}

// 17空struct的作用,用map模拟set,那么就要把值设置成struct{},struct{}不占用内存空间,可以节约内存
type Set map[string]struct{}

func mapToset() {
	set := make(Set)
	for _, item := range []string{"A", "A", "B", "C"} {
		set[item] = struct{}{}
	}
	fmt.Println(len(set))
	if _, ok := set["A"]; ok {
		fmt.Println("A is existing...")
	}
}

// 2个nil不相等的case
// 2个interface可以比较,直接用==,!=比较,只有当2个interface的类型,
// 且值均相等,2个interface才相等,或者2个interface均为nil
func twoDiffNil() {
	var p *int
	var i interface{} = nil
	if p == i {
		fmt.Println("p and i both are nil and equal...")
	} else {
		fmt.Println("p and i both are nil but do not equal...")
	}
}

// 无条件swith 与swith true一样
func switchDemo(time time.Time) {
	switch {
	case time.Hour() < 12:
		fmt.Println("上午好")
	case time.Hour() < 17:
		fmt.Println("下午好")
	default:
		fmt.Println("晚上好")
	}
}

func main() {
	nums := []int{1, 2, 3, 4, 5}
	sum(nums...)
	//twoDiffNil()
	//mapToset()
	switchDemo(time.Now())
}
